To validate a software application (such as, for example, a web application or a desktop application), a user may manually write test cases for the application, execute the application under the test cases, and check for violations of properties that should hold true under the test cases. To check for violations, the user may use external monitors that automatically check whether the properties are true at predetermined times during execution of the application or use inline assertions added to the source code of the application that return results at predetermined times during execution of the application indicating whether the properties are true. Such validation is substantially ad hoc, manual, and resource intensive and provides relatively limited coverage of potential bugs, especially corner-case bugs.